package com.berchen.code.desaes;
import com.sun.org.apache.xml.internal.security.exceptions.Base64DecodingException;
import com.sun.org.apache.xml.internal.security.utils.Base64;
import javax.crypto.BadPaddingException;
import javax.crypto.Cipher;
import javax.crypto.IllegalBlockSizeException;
import javax.crypto.NoSuchPaddingException;
import javax.crypto.spec.SecretKeySpec;
import java.security.InvalidKeyException;
import java.security.NoSuchAlgorithmException;

public class DesAesTest {
    public static void main(String[] args) throws NoSuchPaddingException, NoSuchAlgorithmException, InvalidKeyException, BadPaddingException, IllegalBlockSizeException, Base64DecodingException {

        // 原文
        String input="陈琬皓";

        // 定义key DES 的密钥必须是8个字节的整数倍
        // AES 的密钥必须是16个字节的整数倍
//        String key="陈琬78";
        String key="陈琬7812345678";

        // 算法
//        String transformation="DES";
        // ECB 表示加密模式
        // PKCS5Padding 表示填充模式
        String transformation="DES/ECB/PKCS5Padding";
//        String transformation="AES";
        // 加密类型
//        String algorithm="DES";
        String algorithm="AES";
        String s = encrypt(input, key, transformation, algorithm);
        System.out.println(s);
        String s1 = decrypt(s, key, transformation, algorithm);
        System.out.println(s1);

    }

    /**
     * des解密
     * @param encryptDes        密文（转码之后的）
     * @param key               密钥
     * @param transformation    加密算法
     * @param algorithm         加密类型
     * @return  原文
     */
    private static String decrypt(String encryptDes, String key, String transformation, String algorithm) throws InvalidKeyException, BadPaddingException, IllegalBlockSizeException, NoSuchPaddingException, NoSuchAlgorithmException, Base64DecodingException {

        Cipher cipher = Cipher.getInstance(transformation);

        SecretKeySpec secretKeySpec=new SecretKeySpec(key.getBytes(),algorithm);
        cipher.init(Cipher.DECRYPT_MODE,secretKeySpec);

        byte[] bytes = cipher.doFinal(Base64.decode(encryptDes));

        return new String(bytes);
    }

    /**
     * des加密方法
     * @param input 原文
     * @param key   密钥
     * @param transformation    算法
     * @param algorithm         加密类型
     * @return  密文 进行转码
     */
    private static String encrypt(String input, String key, String transformation, String algorithm) throws InvalidKeyException, BadPaddingException, IllegalBlockSizeException, NoSuchPaddingException, NoSuchAlgorithmException {
        // 创建加密对象
        Cipher des = Cipher.getInstance(transformation);


        // 加密规则
        // 第一个参数  key的字节
        // 第二个参数  加密类型
        SecretKeySpec secretKeySpec = new SecretKeySpec(key.getBytes(), algorithm);

        // 加密初始化
        // 第一个参数 模式  ：加密  ，解密
        // 第二个参数 加密规则
        des.init(Cipher.ENCRYPT_MODE,secretKeySpec);


        // 加密方法
        // 参数表示原文的字节数组
        // 返回值就是密文
        byte[] bytes = des.doFinal(input.getBytes());

        // 打印密文 直接打印会出现乱码(乱码是因为在编码表上面找不到字符)
        System.out.println(new String(bytes));
        // apache的
        return Base64.encode(bytes);
    }

}
